const CHUNK_SIZE = 2 * 1024 * 1024; //每个切片的大小
const THREAD_COUNT = navigator.hardwareConcurrency || 4; //获取cpu线程数  有多少个线程数，就开多少个线程
export function cutFile(file) {
  return new Promise((resolve) => {
    const chunkCount = Math.ceil(file.size / CHUNK_SIZE); //切片总数
    const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT); // 给每个线程分几片
    let result = [];
    let finishCount = 0; //完成线程数量
    for (let i = 0; i < THREAD_COUNT; i++) {
      //每次循环创建一个线程 分配任务
      const worker = new Worker(new URL("./worker.js", import.meta.url), {
        type: "module",
      });
      // const worker = new Worker("./worker.js");
      const start = i * threadChunkCount; //每个线程是从第几个分片开始工作  有可能文件太小，线程数量太多，线程浪费，第31行循环已经做了限制不取超出的
      let end = (i + 1) * threadChunkCount; //每个线程到哪里结束  可能会超出总的分片数
      if (end > chunkCount) {
        end = chunkCount;
      }

      //往这个线程里面传递一些任务消息
      worker.postMessage({
        file,
        CHUNK_SIZE,
        startChunkIndex: start,
        endChunkIndex: end,
      });
      //分片结束接收处理结果信息
      worker.onmessage = (e) => {
        //结果应该是每个分片处理结果的稽核数组 不能直接push，因为开启多个线程，不知道那个线程先完成
        for (let j = start; j < end; j++) {
          //这里的可能线程数大于任务数，导致start大于end，不过在这个循环中做了循环限制必须start<end,才执行循环体的内代码。
          result[j] = e.data[j - start]; //下标赋值，减去前面线程的任务数等于每个线程返回的分片数组结果的索引
        }

        worker.terminate(); //这个线程结束了
        finishCount++;
        if (finishCount === THREAD_COUNT) {
          //等所有的线程都结束了或者所有分片都被分配
          resolve(result);
        }
      };
    }
  });
}
